#ifndef CHARTSTYLEFACTORY_HPP
#define CHARTSTYLEFACTORY_HPP

/*! \file chartstylefactory.hpp
 *
 *  \brief Definicja klasy ChartStyleFactory.
 *
 *  Plik zawiera definicję klasy ChartStyleFactory,
 *  która jest odpowiedzialna za tworzenie instancji
 *  biblioteki stylów.
 *
 *  \author Karol Kurpanik
 *  \date 2011.04.04
 *  \version 2.20.4
 */

#include "bibstyle.hpp"

/*! \class ChartStyleFactory
 *
 * \brief Klasa pozwalająca na tworzenie instancji
 * biblioteki stylów.
 *
 * Klasa zawiera metody oraz pola pozwalające na
 * utworzenie zmiennej statycznej przechowującej
 * bibliotekę stylów.
 */
class ChartStyleFactory
{
public:
    /*!
     * \brief Metoda zwracająca obiekt przechowujący
     * bibliotekę stylów.
     *
     * Metoda zwraca statyczny obiekt klasy ChartStyleFactory,
     * który zawiera wczytaną bibliotekę stylów i jest
     * dostępny w każdym miejscu w programie.
     * \return static ChartStyleFactory
     */
    inline static ChartStyleFactory& Instance() {
        static ChartStyleFactory instance;
        return instance;
    }
    /*!
     * \brief Metoda pozwalająca na dodanie nowego
     * stylu do istniejącej biblioteki.
     *
     * Metoda dodaje do wektora ChartStyleFactory::_Styles
     * element, będący nowo zdefiniowanym stylem.
     * \param id numer ID stylu - dowolna liczba większa od zera,
     * \param lt rodzaj linii - liczba naturalna w postaci napisu string,
     * \param lc kolor linii - liczba naturalna w postaci napisu string,
     * \param lw szerokość linii - liczba naturalna w postaci napisu string,
     * \param pt rodzaj punktu - liczba naturalna w postaci napisu string,
     * \param ps rozmiar punktu - liczba naturalna w postaci napisu string,
     * \param pi interwał punktu - liczba naturalna w postaci napisu string.
     * \post do wektora ChartStyleFactory::_Styles zostaje dodany nowy wskaźnik
     * na obiekt ChartStyle.
     * \return void
     */
    void addStyle(int id, string lt, string lc, string lw,
                  string pt, string ps, string pi);
    /*!
     * \brief Metoda usuwająca wszystkie wczytane wcześniej style.
     *
     * Usuwa wszystkie elementy z wektora ChartStyleFactory::_Styles.
     * \return void
     */
    void remStyles();
    /*!
     * \brief Tworzy nową bibliotekę stylów.
     *
     * Metoda alokuje pamięć na nowy obiekt będący biblioteką
     * stylów i zwraca wskaźnik na ten obiekt. Wcześniej jednak
     * jednemu z pól obiektu klasy BibStyle zostaje przypisany
     * wektor przechowujący wczytane style.
     * \return BibStyle *
     */
    BibStyle* CreateBibStyle();

private:
    /*!
     * \brief Przechowuje bibliotekę stylów.
     *
     * Pole przechowuje bibliotekę stylów w formie
     * wskaźników na obiekty klasy ChartStyle.
     */
    std::vector<ChartStyle*> _Styles;

    /*!
     * \brief Konstruktor klasy ChartStyleFactory.
     */
    inline explicit ChartStyleFactory() {}
    /*!
     * \brief Destruktor klasy ChartStyleFactory.
     */
    inline ~ChartStyleFactory() {};
    /*!
     * \brief Konstruktor kopiujący klasy ChartStyleFactory.
     */
    inline explicit ChartStyleFactory(ChartStyleFactory const&) {}
    /*!
     * \brief Przeciążenie operatora =.
     */
    inline ChartStyleFactory& operator=(ChartStyleFactory const&) { return *this; }
};

#endif // CHARTSTYLEFACTORY_HPP
